perm filename HYMTCH.124[AID,LSP]1 blob
sn#656536 filedate 1982-05-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 2 Way Matcher
C00011 00003 Here are the macros which define the simple tree structure case
C00016 ENDMK
C⊗;
;;; 2 Way Matcher
;;; Here are the macros which define the simple hunk structure case
(DECLARE (FASLOAD STRUCT FAS DSK (MAC LSP)))
(DECLARE (SETQ DEFMACRO-FOR-COMPILING ()))
(DEFSTRUCT MSTATE
CURRENT-OBJECT
STACK
(PUNTED ())
(NULLP ())
(ATOMIC ())
H-STRUCT
(SIZE 0)
(CURRENT-INDEX 0) )
(DEFUN %%ADVANCE (N SIZE)
(COND ((= N (1- SIZE)) 0)
(T (1+ N))))
(DEFUN D-ATOMIC (X)
(ATOMIC X))
(DEFUN D-CURRENT-ATOMIC (X)
(NOT (HUNKP (CURRENT-OBJECT X))))
(DEFUN D-UNDECOMPOSABLE (X)
(OR (NULL X)(ATOM X)(NULLP X) (ATOMIC X)))
(DEFMACRO D-CURRENT (X)
`(CURRENT-OBJECT ,X))
(DEFMACRO D-CURRENT-OBJECT (X)
`(CURRENT-OBJECT ,X))
(DEFUN D-ADVANCE (X)
(COND ((PUNTED X)
(MAKE-MSTATE NULLP (NULL X)
ATOMIC ()
STACK (CDR (STACK X))
PUNTED T
CURRENT-OBJECT (CAR (STACK X))
SIZE (SIZE X)
CURRENT-INDEX 0
H-STRUCT ()))
(T (LET ((N (%%ADVANCE (CURRENT-INDEX X)
(SIZE X))))
(MAKE-MSTATE NULLP (= 0 (CURRENT-INDEX X))
ATOMIC ()
STACK ()
PUNTED ()
CURRENT-OBJECT (CXR N (H-STRUCT X))
SIZE (SIZE X)
CURRENT-INDEX N
H-STRUCT (H-STRUCT X))))))
(DEFMACRO D-VAR-TYPE (ATOM)
;; returns the 1st character of a D-atomic object
`(COND ((EQ (TYPEP ,ATOM) 'SYMBOL) (GETCHAR ,ATOM 1.))))
(DEFMACRO D-CHANGE-CURRENT (X Y) `(PROGN (SETF (CURRENT-OBJECT ,X) ,Y)
,X))
(DEFUN D-CHANGE (X Y)
(COND ((HUNKP Y)
(MAKE-MSTATE NULLP ()
ATOMIC ()
STACK ()
PUNTED ()
CURRENT-OBJECT (CXR 1 Y)
SIZE (HUNKSIZE Y)
CURRENT-INDEX 1
H-STRUCT Y))
(T
(MAKE-MSTATE NULLP (NULL Y)
ATOMIC T
STACK ()
PUNTED ()
CURRENT-OBJECT Y
SIZE 0
CURRENT-INDEX 0
H-STRUCT ())) ))
(DEFMACRO D-RESTRICT-VAR (X) `(CADR ,X))
(DEFUN D-MAP-BUILD (FUN H)
(COND ((NULLP H) ())
(T (CONS (FUNCALL FUN (CURRENT-OBJECT H))
(D-MAP-BUILD FUN (D-ADVANCE H))))))
(DEFMACRO D-CURRENT-EMPTY (X) `(NULL (CURRENT-OBJECT ,X)))
(DEFMACRO D-EMPTY (X) `(NULLP ,X))
(DEFUN D-LISTIFY (X)
(COND ((NULLP X) ())
((PUNTED X) (STACK X))
(T (LET ((SIZE (SIZE X))
(H (H-STRUCT X)))
(DO ((I (CURRENT-INDEX X) (%%ADVANCE I SIZE))
(A ()))
((= 0 I) (CONS (CXR 0 H) (NREVERSE A)))
(PUSH (CXR I H) A))))))
(DEFUN D-LISTIFY-REST (X)
(COND ((NULLP X) ())
((PUNTED X) (STACK X))
(T (LET ((SIZE (SIZE X))
(H (H-STRUCT X)))
(DO ((I (%%ADVANCE (CURRENT-INDEX X) SIZE)
(%%ADVANCE I SIZE))
(A ()))
((= 0 I) (CONS (CXR 0 H) (NREVERSE A)))
(PUSH (CXR I H) A))))))
(DEFMACRO D-RESTRICT-FUNS (X) `(CDDR ,X))
(DEFMACRO D-RESTRICTP (%/#X) `(AND (EQ (TYPEP ,%/#X) 'LIST)
(MEMQ (CAR ,%/#X)
'($R RESTRICT ⊗R $IR IRESTRICT ⊗IR))))
(DEFMACRO D-IRESTRICTP (%/#X) `(AND (EQ (TYPEP ,%/#X) 'LIST)
(MEMQ (CAR ,%/#X)
'($IR IRESTRICT ⊗IR))))
(DEFMACRO D-FRESTRICTP (%/#X) `(AND (EQ (TYPEP ,%/#X) 'LIST)
(MEMQ (CAR ,%/#X)
'($R RESTRICT ⊗R))))
(DEFMACRO D-RESTRICT-VAR (X) `(CADR ,X))
(DEFMACRO D-RESTRICT-TYPE (X) `(CAR ,X))
(DEFMACRO D-CREATE-RESTRICTION (X Y Z)
`(CONS ,X (CONS ,Y ,Z)))
(DEFUN D-ADD-ITEM (X ITEM)
(MAKE-MSTATE
CURRENT-OBJECT ITEM
STACK (CONS (CURRENT-OBJECT X) (STACK X))
PUNTED (PUNTED X)
NULLP ()
ATOMIC (ATOMIC X)
H-STRUCT (H-STRUCT X)
SIZE (SIZE X)
CURRENT-INDEX (CURRENT-INDEX X)))
(DEFUN D-ADD-ITEMS (X ITEMS)
(MAKE-MSTATE
CURRENT-OBJECT (CAR ITEMS)
STACK (APPEND (CDR ITEMS)
(CONS (CURRENT-OBJECT X) (STACK X)))
PUNTED (PUNTED X)
NULLP ()
ATOMIC (ATOMIC X)
H-STRUCT (H-STRUCT X)
SIZE (SIZE X)
CURRENT-INDEX (CURRENT-INDEX X)))
(DEFUN D-REST-EMPTY (X)
(COND ((NULLP X) T)
((PUNTED X) (NULL (STACK X)))
(T (= (CURRENT-INDEX X) 0))))
(DEFUN D-CREATE-STATE (X)
(MAKE-MSTATE NULLP ()
ATOMIC ()
STACK ()
PUNTED ()
CURRENT-OBJECT (CXR 1 X)
SIZE (HUNKSIZE X)
CURRENT-INDEX 1
H-STRUCT X)))
(DEFUN D-CHANGE-CURRENT-ITEMS (X ITEMS)
(SETF (NULLP X) ())
(SETF (STACK X)
(APPEND (CDR ITEMS) (STACK X)))
(SETF (CURRENT-OBJECT X) (CAR ITEMS))
X)
(DEFUN D-CREATE-NULL-STATE ()
(MAKE-MSTATE NULLP T
ATOMIC ()
STACK ()
PUNTED T
CURRENT-OBJECT ()
SIZE 0
CURRENT-INDEX 0
H-STRUCT ()))
(DEFUN D-CREATE-STATE-FROM-CURRENT (X)
(LET ((Y (CURRENT-OBJECT X)))
(COND ((HUNKP Y)
(MAKE-MSTATE NULLP ()
ATOMIC ()
STACK ()
PUNTED ()
CURRENT-OBJECT (CXR 1 Y)
SIZE (HUNKSIZE Y)
CURRENT-INDEX 1
H-STRUCT Y))
(T
(MAKE-MSTATE NULLP (NULL Y)
ATOMIC T
STACK ()
PUNTED ()
CURRENT-OBJECT Y
SIZE 0
CURRENT-INDEX 0
H-STRUCT ())) )))
(DEFMACRO D-CHECK (X) X)
;;; Here are the macros which define the simple tree structure case
(DEFMACRO P-ATOMIC (X) `(ATOM ,X))
(DEFMACRO P-UNDECOMPOSABLE (X)
`(OR (ATOM ,X)
(HUNKP ,X)))
(DEFMACRO P-CURRENT (X) `(CAR ,X))
(DEFMACRO P-CURRENT-OBJECT (X) X)
(DEFMACRO P-ADVANCE (X) `(CDR ,X))
(DEFMACRO P-VAR-TYPE (ATOM)
;; returns the 1st character of an atom.
`(COND ((EQ (TYPEP ,ATOM) 'SYMBOL) (GETCHAR ,ATOM 1.))))
(DEFMACRO P-CHANGE-CURRENT (X Y) `(CONS ,Y (CDR ,X)))
(DEFMACRO P-CHANGE (X Y) Y)
(DEFMACRO P-RESTRICT-VAR (X) `(CADR ,X))
(DEFUN P-MAP-BUILD (FUN LIST)
(COND ((NULL LIST) ())
(T (CONS (FUNCALL FUN (CAR LIST))
(P-MAP-BUILD FUN (CDR LIST))))))
(DEFMACRO P-CURRENT-EMPTY (X) `(NULL (CAR ,X)))
(DEFMACRO P-EMPTY (X) `(NULL ,X))
(DEFMACRO P-LISTIFY (X) X)
(DEFMACRO P-LISTIFY-REST (X) `(CDR ,X))
(DEFMACRO P-RESTRICT-FUNS (X) `(CDDR ,X))
(DEFMACRO P-RESTRICTP (%/#X) `(AND (NOT (ATOM ,%/#X))
(MEMQ (CAR ,%/#X)
'($R RESTRICT ⊗R $IR IRESTRICT ⊗IR))))
(DEFMACRO P-IRESTRICTP (%/#X) `(AND (NOT (ATOM ,%/#X))
(MEMQ (CAR ,%/#X)
'($IR IRESTRICT ⊗IR))))
(DEFMACRO P-FRESTRICTP (%/#X) `(AND (NOT (ATOM ,%/#X))
(MEMQ (CAR ,%/#X)
'($R RESTRICT ⊗R))))
(DEFMACRO P-RESTRICT-VAR (X) `(CADR ,X))
(DEFMACRO P-RESTRICT-TYPE (X) `(CAR ,X))
(DEFMACRO P-CREATE-RESTRICTION (X Y Z)
`(CONS ,X (CONS ,Y ,Z)))
(DEFMACRO P-ADD-ITEM (X ITEMS)
`(CONS ,ITEMS ,X))
(DEFMACRO P-ADD-ITEMS (X ITEMS)
`(APPEND ,ITEMS ,X))
(DEFMACRO P-REST-EMPTY (X) `(NULL (CDR ,X)))
(DEFMACRO P-CREATE-STATE (X) X)
(DEFMACRO P-CHANGE-CURRENT-ITEMS (X ITEMS)
`(APPEND ,ITEMS (CDR ,X)))
(DEFMACRO P-CREATE-NULL-STATE () ())
(DEFMACRO P-CREATE-STATE-FROM-CURRENT (X) `(CAR ,X))
(DEFMACRO P-CURRENT-ATOMIC (X) `(ATOM (CAR ,X)))
(DECLARE (SPECIAL -SEENR- -SEEN-))
(DEFMACRO CONSP (X) `(EQ (TYPEP ,X) 'LIST))
(DEFUN P-CHECK (L)
((LAMBDA (-SEEN- -SEENR-)
(P-CHECK1 L)) ()()))
(DEFUN P-CHECK1 (L)
(COND ((MEMQ L -SEENR-) (P-CURRENT L))
((P-UNDECOMPOSABLE L) (PUSH (P-CURRENT-OBJECT L) -SEENR-)
(PUSH L -SEENR-)
(P-CURRENT-OBJECT L))
((P-ATOMIC L) (P-CURRENT-OBJECT L))
((AND (CONSP (P-CURRENT L))
(EQ (P-CURRENT L) '-SPECIAL-FORM-))
(P-ADVANCE L))
(T
(LET ((X (P-MAP-BUILD #'P-CHECK1 L)))
(PUSH L -SEENR-)
(PUSH X -SEEN-) X))))
(EVAL-WHEN (COMPILE EVAL)
(SETQ MATCH-PREFIX '%%
MATCH-NAME '%UMATCH))
(INCLUDE "GMATCH.125")